iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

設計模式系列 第 3

Day3 - 原型模式(Prototype pattern)

  • 分享至 

  • xImage
  •  

介紹
當需要一個物件的複本,可先創建出一個新的該類別物件,再將其成員設為欲複製物件的內容。但有時重新創建物件所需的成本太高,像是物件成員值需透過耗時的操作取得(如:讀取IO、資料庫存取、網路互動等),此時可考慮使用 原型模式 將目標物件直接複製一份出來。

C++範例

  1. 提供一個含有 複製物件函式 的介面。
  2. 將欲複製的物件類別繼承該介面並實作複製物件函式。
  3. 使用者呼叫欲複製的物件的複製物件函式來獲取複本物件。
#include <iostream>

// 提供一個含有 複製物件函式 的介面
class Prototype
{
public:
    // 複製物件函式
    virtual Prototype* Clone() = 0;
    virtual ~Prototype() {}
    virtual void PrintStatus() const = 0;
};

// 將欲複製的物件類別繼承上述介面,並實作複製物件函式
class Monster : public Prototype
{
public:
	Monster(int hp, int armor) : m_HealthPoints(hp), m_ArmorPoints(armor)
	{
	}
    
    // 拷貝構造函式
    Monster(const Monster& obj)
    {
        // 這裡實作物件複製的細節
        m_HealthPoints = obj.m_HealthPoints;
        m_ArmorPoints = obj.m_ArmorPoints;
    }

	void PrintStatus() const override
	{
        std::cout << "HP: " << m_HealthPoints << std::endl;
        std::cout << "Armor: " << m_ArmorPoints << std::endl;
	}

    Prototype* Clone() override
	{
        // 使用拷貝構造函式來複製物件內容
		return new Monster(*this); 
	}

private:
	int m_HealthPoints;
	int m_ArmorPoints;
};

// 使用方法
int main()
{
    // 創建一個Monster物件
    Prototype* monster = new Monster(100, 50);

    // 取得Monster物件的複本
    Prototype* anotherMonster = monster->Clone();

    // 顯示複本Monster物件的生命及裝甲值
    anotherMonster->PrintStatus();
    
    delete anotherMonster;
    delete monster;

    return 0;
}

Output:

HP: 100
Armor: 50

上一篇
Day2 - 單例模式(Singleton pattern)
下一篇
Day4 - 工廠模式: 簡單工廠模式(Simple factory pattern)
系列文
設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言